#ifndef EXTFLASH_H
#define EXTFLASH_H

#include "include.h"

#define Addr_Init_Flag_Size             0x01
#define Addr_Hyper_Parameter_Size       sizeof(HYPER_PARAMETER)
#define Addr_Parameter_Size             sizeof(PARAMETER)

#define Extflash_Addr_Init_Flag                 (128*15*4096)
#define Extflash_Addr_Hyper_Parameter           (128*15*4096+256)
#define Extflash_Addr_Parameter                 (128*15*4096+512)


#define Cycle_Queue_Data_Size                   256
#define Cycle_Queue_Len_Max                     (128*15*4096)

typedef struct
{
  uint32_t  head;      //进队列的数据有几个整队列长度
  uint32_t  tail;      //出队列的数据有几个整队列长度
  uint16_t  write_len;
  uint16_t  read_len;
  uint8_t   write_data[Cycle_Queue_Data_Size];
  uint8_t   read_data[Cycle_Queue_Data_Size];
}__attribute__((packed, aligned(1))) CYCLE_QUEUE;

typedef struct
{
  unsigned char          region;         //行政区
  unsigned char          management;     //管理处
  unsigned char          station;        //站所
  unsigned short         stake_front;    //桩号（前）
  unsigned short         stake_back;     //桩号（后）
  unsigned char          dev_type;       //设备类型
  unsigned char          dev_vender;     //设备厂家
  unsigned char          serial;         //顺序编号
}__attribute__((packed, aligned(1))) ADDR;

typedef struct
{
  /* 设备信息 */
  ADDR                  addr;                                           // 设备编号
  int16_t               password;                                       // 设备密钥
  float                 hardware_version;                               // 硬件版本
  float                 software_version;                               // 软件版本
  /* 门限设置 */
  int32_t               encoder_upper_limit;                            // 编码器上限
  int32_t               encoder_lower_limit;                            // 编码器下限
  int16_t               gate_front_water_stage_upper_limit;             // 闸前水位上限
  int16_t               gate_front_water_stage_lower_limit;             // 闸前水位下限
  int16_t               gate_back_water_stage_upper_limit;              // 闸后水位上限
  int16_t               gate_back_water_stage_lower_limit;              // 闸后水位下限
  int16_t               voltage_upper_limit;                            // 电压上限
  int16_t               voltage_lower_limit;                            // 电压下限
  int16_t               current_upper_limit;                            // 电流上限
  int16_t               current_lower_limit;                            // 电流下限
  int16_t               temperature_upper_limit;                        // 温度上限
  int16_t               temperature_lower_limit;                        // 温度下限
  /* 设备参数设置 */
  int8_t                gate_front_water_stage_addr;                    // 闸前水位地址
  int8_t                gate_back_water_stage_addr;                     // 闸后水位地址
  int16_t               gate_front_water_stage_zero;                    // 闸前水位零值
  int16_t               gate_back_water_stage_zero;                     // 闸后水位零值
  int32_t               gate_height;                                    // 闸门高度
  int32_t               gate_width;                                     // 闸门宽度
  int32_t               gate_full_open_time;                            // 闸门全开时间
  float                angle_to_displacement_coefficient;              // 角度转换为位移的系数
  /* 服务器 */
  uint8_t               upload_target_server_ip[4];                     // 服务器ip地址
  int16_t               upload_target_port;                             // 服务器端口
  int16_t               reconnect_server_timer;                         // 重连时间 :单位 ： 120
  /*  */

}__attribute__((packed, aligned(1))) HYPER_PARAMETER;

typedef struct
{
  uint8_t               whether_use_password;
  uint8_t               control_object;
  uint8_t               control_mode;
  uint32_t              func_data_cycle;
  uint32_t              THA_data_cycle;

}__attribute__((packed, aligned(1))) PARAMETER;


//EXFLASH的循环队列出队
void sync_buf_read_dequeue( CYCLE_QUEUE *cycle_queue );
//EXFLASH的循环队列入队
void sync_buf_write_enqueue( CYCLE_QUEUE *cycle_queue );

//往EXFLASH中写入一包数据
void push_sub_package_into_exflash( CYCLE_QUEUE *cycle_queue, unsigned char *prepare_data );
//从EXFLASH中读出一包数据
void from_exflash_read_package( CYCLE_QUEUE *cycle_queue );

void sync_send_buf_forward( CYCLE_QUEUE *cycle_queue );

unsigned char  initflag_get(void);
void            initflag_set(unsigned char flag );
void            hyper_parameter_set( void );
void            hyper_parameter_get( void );
void            parameter_set( void );
void            parameter_get( void );
void            app1_start_count_set( unsigned char count );
void            app1_start_count_get( void );
#endif